package win.larryzeal.jmx.mbean.advance;

import java.util.ArrayList;
import java.util.Collection;

/**
 * ThreadPoolStatus 实现了 ThreadPoolStatusMBean 接口，它提供了每个访问器的明显实现。
 * 与 MBean 实现类中的典型情况一样，每个操作实现起来都很细碎，所以把实现委托给了底层受管对象。
 * 在这个示例中，JMX 代码完全独立于受管实体的代码。
 * TrackingThreadPool 对于 JMX 一无所知；通过为相关的属性提供管理方法和访问器，它提供了自己的编程管理接口。
 * 还可以选择在实现类中直接实现管理功能（让 TrackingThreadPool 实现 TrackingThreadPoolMBean 接口），或者单独实现（本例ThreadPoolStatus implements ThreadPoolStatusMBean）。
 *
 * Created by 张少昆 on 2017/8/21 0021.
 */
public class ThreadPoolStatus implements ThreadPoolStatusMBean {
	private final TrackingThreadPool pool;

	public ThreadPoolStatus(TrackingThreadPool pool) {
		this.pool = pool;
	}

	public int getActiveThreads() {
		return pool.getPoolSize();
	}

	public int getActiveTasks() {
		return pool.getActiveCount();
	}

	public int getTotalTasks() {
		return pool.getTotalTasks();
	}

	public int getQueuedTasks() {
		return pool.getQueue().size();
	}

	public double getAverageTaskTime() {
		return pool.getAverageTaskTime();
	}

	public String[] getActiveTaskNames() {
		return toStringArray(pool.getInProgressTasks());
	}

	public String[] getQueuedTaskNames() {
		return toStringArray(pool.getQueue());
	}

	/**
	 *
	 * @param collection
	 * @return
	 */
	private String[] toStringArray(Collection<Runnable> collection) {
		ArrayList<String> list = new ArrayList<String>();
		for (Runnable r : collection)
			list.add(r.toString());
		return list.toArray(new String[0]);
	}
}